package collection;

import java.util.LinkedHashSet;
import java.util.Set;

/**
 * LinkedHashSet
 */
public class LinkedHashSet_ {

    public static void main(String[] args) {

        /*
            LinkedHashSet 是 HashSet子类
            LinkedHashSet 底层是一个 LinkedHashMap ，底层维护了一个 数组 + 双向链表
            LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置，同时使用链表维护元素的次序，使得元素看起来是以插入顺序保存的
            LinkedHashSet 不允许添加重复元素
         */

        /*
            在LinkedHashSet中维护了一个 hash表 和 双向链表(LinkedHashSet有 head 和 tail)
            每一个节点有 before 和 after 属性，这样可以形成双向链表
            在添加一个元素时，先求 hash 值，再求索引。确定该元素在 table 的位置，然后将添加的元素加入到双向链表(如果已经存在不添加,规则与HashSet相同)
            这样的话，遍历 LinkedHashSet 也能确保插入顺序和遍历顺序一致
         */

        /*
            添加第一次时，直接将 数组table扩容到16,存放的结点类型是 LinkedHashMap$Entry
            数组是 HashMap$Node[] 存放的元素是 LinkedHashMap$Entry
            扩容机制同HashSet
            可以debug以下代码验证
         */
        Set set = new LinkedHashSet();
        set.add(new String("AA"));
        set.add(456);
        set.add(456);
        set.add(new String("BB"));
        set.add(123);

        System.out.println("set: " + set);

    }
}

